home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Mail / send / send.m < prev    next >
Text File  |  1992-02-26  |  4KB  |  150 lines

  1. /*
  2.  * send [-f file] [-s subject] [-c Cc_list] to_list
  3.  *
  4.  * Open a MailApp Send window with the subject:, cc:, and to: as given.
  5.  * The body of the message is taken from 'file' or the standard input.
  6.  * (For a null body, use: -f "").  If the body of the message contains
  7.  *    ^Subject:...
  8.  *    ^Cc:...
  9.  *    ^To:...
  10.  * these will be appended to any information gleaned from the command line.
  11.  *
  12.  * If you make modifications, please alert the author.
  13.  *
  14.  * But if you simply use this program and it improves your lot in life 
  15.  * even a little, express your gratitude by sending a picture postcard to 
  16.  * B.L. McLanahan at the MIT Media Laboratory.  B.L. is Marvin Minsky's
  17.  * assistant.  Tell B.L. this so it'll know it's from one of you:
  18.  *
  19.  *    Yo!  B.L. --
  20.  *
  21.  *    You must get totally cosmo mail, working with Marv and all,
  22.  *    but if you haven't been getting enough lately, here's one from me:
  23.  *    I woke up this morning and -- guess what?!
  24.  *    I heard Dick Button feeding me instructions through a FILLING
  25.  *    in my right MOLAR!  He was shouting something about
  26.  *    my double toe-loop being flaccid!  Is that CRAZY or what?!!
  27.  * 
  28.  * Michael Hawley
  29.  * MIT Media Laboratory
  30.  * 20 Ames Street
  31.  * Cambridge MA, 02139
  32.  * mike@media-lab.mit.edu
  33.  * Copyright (c) MIT Media Laboratory, January 1992
  34.  */
  35. #import <stdlib.h>
  36. #import <stdio.h>
  37. #import <appkit/Speaker.h>
  38. #import "argv.h"
  39.  
  40. blank(s) char *s; { /* true if 's' is blank */
  41.     while (*s == ' ' || *s=='\t' || *s == '\n') ++s;
  42.     return !*s;
  43. }
  44.  
  45. stripnl(s) char *s; { /* remove trailing \n and space from 's' */
  46.     char *p = s + strlen(s)-1;
  47.     while (p>=s && (*p=='\n' || *p == ' ' || *p == '\r')) *p-- = '\0';
  48. }
  49.  
  50. append(s,t) char *s, *t; {
  51.     if (*s) strcat(s," ");
  52.     strcat(s,t);
  53. }
  54.  
  55. strtolower(s) char *s; {
  56.     while (*s){
  57.         if (isupper(*s)) *s = tolower(*s);
  58.         s++;
  59.     }
  60. }
  61.  
  62. match(a,b){
  63.     char t[1024];
  64.     strcpy(t,a);
  65.     strtolower(t);
  66.     return strncmp(t,b,strlen(b))==0;
  67. }
  68.  
  69. char *
  70. skipsp(s) char *s; {
  71.     while (*s==' ' || *s=='\t' || *s == '\n') ++s;
  72.     return s;
  73. }
  74.  
  75. void
  76. e(a,b,c,d) char *a; { fprintf(stderr,a,b,c,d); fprintf(stderr,"\n"); }
  77.  
  78.  
  79. #define M 1024
  80. char To[M] = "",
  81.      Cc[M] = "",
  82.      Subject[M]="",
  83.      *LetterFile = (char *)0,
  84.      Letter[64000] = "";
  85.  
  86. void
  87. readLetter(){
  88.     FILE *f;
  89.     char *p;
  90.     int h = 1, headerDone=0;
  91.     if (LetterFile && blank(LetterFile)) return;
  92.     f = LetterFile? fopen(LetterFile,"r") : stdin;
  93.     if (!f) return e("%s: couldn't read '%s'",av0, LetterFile);
  94.     p = Letter;
  95.     while (fgets(p,4096,f)){
  96. #define add(s,p) append(s,skipsp(index(p,':')+1)), headerDone++
  97.         if (h && *p == '\n'){
  98.             h = 0;
  99.             if (headerDone) continue;
  100.         }
  101.         if (h && match(p,"subject:")) add(Subject,p); else
  102.         if (h && match(p,"cc:"))      add(Cc,p);      else
  103.         if (h && match(p,"to:"))      add(To,p);      else
  104.         p += strlen(p), headerDone;
  105.     }
  106.     *p = '\0';
  107.     fclose(f);
  108. }
  109.  
  110. use(){
  111.     e("Use: %s [-s subject] [-c cc_list] [-f file] to_list",av0);
  112.     e("Open a 'Send' window in NeXT Mail.");
  113.     e("  -s subj -- set 'Subject: ' field.");
  114.     e("  -c cc   -- set 'Cc: ' field.");
  115.     e("  -f file -- take body of message from 'file',");
  116.     e("             If 'file' is \"\" use null body.");
  117.     e("             If 'Subject:', 'Cc:', 'To:' appear in the body,");
  118.     e("             append them to anything specified in the argument list.");
  119.     e("If no '-f' option given, read body of message from stdin.");
  120.     exit(1);
  121. }
  122.  
  123. main(ac,av) char *av[]; {
  124.     id s = [Speaker new];
  125.     int i;
  126.  
  127.     for_each_argument {
  128.     Case 'c': append(Cc,argument);
  129.     Case 's': append(Subject,argument);
  130.     Case 'f': LetterFile = argument;
  131.     Default : use();
  132.     }
  133.  
  134.     while (i<ac) append(To,av[i++]);
  135.     readLetter();
  136.  
  137.     NXPortFromName("Mail", NULL); // make sure app is launched
  138.     [s setSendPort:NXPortFromName("MailSendDemo", NULL)];
  139.  
  140.     stripnl(Subject);
  141.     stripnl(To);
  142.     stripnl(Cc);
  143.     stripnl(Letter); if (*Letter) strcat(Letter,"\n");
  144. #define call(a,b) [s performRemoteMethod:a with:b length:strlen(b)+1]
  145.     call("setTo:",To);
  146.     call("setSubject:",Subject);
  147.     call("setCc:",Cc);
  148.     call("setBody:",Letter);
  149. }
  150.